package cz.pecinovsky.english.pojj.adv_demo.cesta_školou.hra;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import static cz.pecinovsky.english.pojj.adv_demo.cesta_školou.hra.SS_CestaSkolou.*;


/**
 *  Class HerniPlan - třída představující mapu adventury.
 *
 *  Tato třída inicializuje prvky ze kterých se hra skládá:
 *  vytváří všechny místnosti (třída Mistnost),
 *  propojuje je vzájemně pomocí východů
 *  a pamatuje si aktuální místnost, ve které se hráč právě nachází.
 *
 *@author     Michael Kolling, Lubos Pavlicek, Jarmila Pavlickova
 *@created    říjen 2008 (poslední změny)
 */
public class HerniPlan {

    //+++ Přidáno pro zařazení do rámce
    private final Map<String, Mistnost> název2místnost =
                                  new HashMap<String, Mistnost>();
    private final HraCestaSkolou hra;
    //--- Konec úpravy

    private Mistnost aktualniMistnost;


    /**
     *  Konstruktor který vytváří jednotlivé místnosti a propojuje je pomocí východů.
     *  Jako výchozí aktuální místnost nastaví halu.
     *
     * @param hra Hra o jejíž plán se jedná - parametr musel být přidán,
     *            aby se příkazy mohly doptat na batoh, který v základní verzi není
     */
    public HerniPlan(HraCestaSkolou hra) {
        //+++ Přidáno pro kompletaci řešení
        this.hra = hra;

        zalozMistnosti();
    }


    /**
     *  Vytváří jednotlivé místnosti a propojuje je pomocí východů.
     *  Jako výchozí aktuální místnost nastaví halu.
     */
    private void zalozMistnosti() {
        Mistnost hala;
        Mistnost ucebna;
        Mistnost bufet;
        Mistnost chodba;
        Mistnost kancelar;

        // vytvářejí se jednotlivé místnosti
        hala   = new Mistnost("hala", "vstupni hala budovy VSE na Jiznim meste",
                              0, 0);
        ucebna = new Mistnost("ucebna", "prednaskova ucebna 103JM",
                              0, 0);
        //+++ Bufetu přidány předměty, aby bylo co zvedat a pokládat
        bufet = new Mistnost("bufet","bufet, kam si muzete zajit na svacinku",
                             0, 0,
                             Objekt.TĚŽKÝ + oPULT,
                             oKOLA, oKOLA, oKOLA, oPROSPEKT, oPROSPEKT);
        chodba = new Mistnost("chodba","spojovaci chodba",
                              0, 0);
        kancelar = new Mistnost("kancelar","kancelar vaseho vyucujiciho Javy",
                              0, 0);

        //+++ Přidáno pro zařazení do rámce
        název2místnost.put("hala",     hala);
        název2místnost.put("ucebna",   ucebna);
        název2místnost.put("bufet",    bufet);
        název2místnost.put("chodba",   chodba);
        název2místnost.put("kancelar", kancelar);

        // přiřazují se východy z místností (sousedící místnosti)
        hala.setVychod(ucebna);
        hala.setVychod(chodba);
        hala.setVychod(bufet);

        ucebna.setVychod(hala);

        bufet.setVychod(hala);

        chodba.setVychod(hala);
        chodba.setVychod(kancelar);

        kancelar.setVychod(chodba);

        aktualniMistnost = hala;  // hra začíná v místnosti hala

    }

    /**
     *  Metoda vrací odkaz na aktuální místnost.
     *
     *@return     aktuální místnost
     */

    public Mistnost getAktualniMistnost() {
        return aktualniMistnost;
    }

    /**
     *  Metoda nastaví aktuální místnost
     *
     *@param  mistnost nová aktuální místnost
     */
    public void setAktualniMistnost(Mistnost mistnost) {
       aktualniMistnost = mistnost;
    }



//== DALŠÍ METODY PŘIDANÉ PŘI ZAŘAZOVÁNÍ DO RÁMCE ==============================

    /***************************************************************************
     * Vrátí kolekci odkazů na jednotlivé místnosti.
     *
     * @return Požadovaná kolekce
     */
    public Collection<Mistnost> getMístnosti()
    {
        return název2místnost.values();
    }


    /***************************************************************************
     * Vrátí instanci hry, jejíž herní plán má na starosti.
     * @return Instance hry, jejíž herní plán má na starosti
     */
    public HraCestaSkolou getHra()
    {
        return hra;
    }

}
